<?php

namespace Common\Api;

class QQConnect{

    /**

     * 获取QQconnect Login 跳转到的地址值

     * @return array 返回包含code state

     *

     **/

    public function login($app_id, $callback, $scope){

        $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection

       return $login_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="

            .$app_id. "&redirect_uri=" . urlencode($callback)

            . "&state=" . $_SESSION['state']

            . "&scope=".urlencode($scope);

//显示出登录地址



    }

    /**

     * 获取access_token值

     * @return array 返回包含access_token,过期时间的数组

     * */

    private function get_token($app_id,$app_key,$code,$callback,$state){

        if($state !== $_SESSION['state']){

            return false;

            exit();

        }

        $url = "https://graph.qq.com/oauth2.0/token";

        $param = array(

            "grant_type"    =>    "authorization_code",

            "client_id"     =>    $app_id,

            "client_secret" =>    $app_key,

            "code"          =>    $code,

            "state"         =>    $state,

            "redirect_uri"  =>    $callback

        );

        $response = $this->get_url($url, $param);

        if($response == false) {

            return false;

        }

        $params = array();

        parse_str($response, $params);

        return $params["access_token"];

    }



    /**

     * 获取client_id 和 openid

     * @param $access_token access_token验证码

     * @return array 返回包含 openid的数组

     * */

    private  function get_openid($access_token) {

        $url = "https://graph.qq.com/oauth2.0/me";

        $param = array(

            "access_token"    => $access_token

        );

        $response  = $this->get_url($url, $param);

        if($response == false) {

            return false;

        }

        if (strpos($response, "callback") !== false) {

            $lpos = strpos($response, "(");

            $rpos = strrpos($response, ")");

            $response  = substr($response, $lpos + 1, $rpos - $lpos -1);

        }

        $user = json_decode($response);

        if (isset($user->error) || $user->openid == "") {

            return false;

        }

        return $user->openid;

    }

    /**

     * 获取用户信息

     * @param $client_id

     * @param $access_token

     * @param $openid

     * @return array 用户的信息数组

     * */

    public function get_user_info($app_id,$token,$openid){

        $url = 'https://graph.qq.com/user/get_user_info?oauth_consumer_key='.$app_id.'&access_token='.$token.'&openid='.$openid.'&format=json';

        $str = $this->get_url($url);

        if($str == false) {

            return false;

        }

        $arr = json_decode($str,true);

        return $arr;

    }



    /**

     * 请求URL地址，返回callback得到返回字符串

     * @param $url qq提供的api接口地址

     * */



    public function callback($app_id, $app_key, $callback) {

        $code = $_GET['code'];

        $state = $_GET['state'];

        $token = $this->get_token($app_id,$app_key,$code,$callback,$state);

        $openid = $this->get_openid($token);

        if(!$token || !$openid) {

            return false;

            exit();

        }

        return array('openid' => $openid, 'token' => $token);

    }





    /*

     * HTTP GET Request

    */

    private  function get_url($url, $param = null) {

        if($param != null) {

            $query = http_build_query($param);

            $url = $url . '?' . $query;

        }

        $ch = curl_init();

        if(stripos($url, "https://") !== false){

            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        }



        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );

        $content = curl_exec($ch);

        $status = curl_getinfo($ch);

        curl_close($ch);

        if(intval($status["http_code"]) == 200) {

            return $content;

        }else{

            echo $status["http_code"];

            return false;

        }

    }



    /*

     * HTTP POST Request

    */

    private  function post_url($url, $params) {

        $ch = curl_init();

        if(stripos($url, "https://") !== false) {

            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        }



        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );

        curl_setopt($ch, CURLOPT_POST, true);

        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

        $content = curl_exec($ch);

        $status = curl_getinfo($ch);

        curl_close($ch);

        if(intval($status["http_code"]) == 200) {

            return $content;

        } else {

            return false;

        }

    }

}